<?php
require 'config.php';

function uhetdump($var){

	echo '<pre>';
	var_dump($var);
	echo "</pre>\n";
}

function uhetecho($var){
	echo '<pre>';
	echo $var;
	echo "</pre>\n";
}

/**
 * ambiente de desenvolvimento, altamente verboso
 */
ini_set("display_errors", 1);
error_reporting(E_ALL);

class Aplicacao
{
	private $classe;
	private $metodo;
	private $arquivo;
	private $entity;
	private $controller;
	private $parametros;
	
	public function __construct()
	{

	}

	public function setEntity()
	{
		if (isset($_GET['c'])){
			
			$this->entity = $_GET['c'];
			unset($_GET['c']);
			uhetecho("entidade: $this->entity");
		} else {
			
			die('qual a entidade padrão?');
		}
	}
	
	/**
	 * configura a classe
	 */
	private function setClasse()
	{

		if (isset($this->entity)){
			
			$this->classe =
				CONTROLLER_CLASS_PREFIX .
				ucfirst($this->entity);
			uhetecho("classe: $this->classe");
		} else {
			//die('qual a controller?');
		}
	}

	/**
	 * configura o metodo
	 */
	private function setMetodo()
	{
		
		if (isset($_GET['m'])){
			
			$this->metodo = $_GET['m'];
			unset($_GET['m']);
			uhetecho("metodo: $this->metodo");
		} else {
			//die('qual o metodo?');
		}
	}

	/**
	 * configura qual arquivo eh nescessario para a classe
	 */
	private function setArquivo()
	{
		
		if (isset($this->classe)){
			
			$this->arquivo =
				CONTROLLER_DIR . 
				$this->classe .
				'.php';
			uhetecho("arquivo: $this->arquivo");
			uhetecho("controller_dir: ". CONTROLLER_DIR);
			uhetecho("controller_file_prefix: ". CONTROLLER_FILE_PREFIX);
		} else {
			die('a classe prescisa ser conhecida para setar o arquivo');
		}
	}
	
	/**
	 * configura um array de parametros que vieram por GET
	 */
	private function setParametros()
	{
		
		$this->parametros = $_GET;
		unset($_GET);
	}
	
	/**
	 * faz o parser dos parametros que vieram por GET
	 */
	public function parser()
	{
		
		// veio algum parametro por GET
		if (isset($_GET)){
			
			$this->setEntity();
			$this->setClasse();
			$this->setMetodo();
			$this->setArquivo();
			$this->setParametros();

		} else {
			die('para onde eu vou sem parametros?');
		}
	}

	/**
	 * inclui o arquivo adequado
	 * @return retorna true para sucesso, false para falha
	 */
	private function loadArquivo()
	{
		
		if (file_exists($this->arquivo)){
			
			require_once($this->arquivo);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * carrega a classe adequada
	 * @return true para sucesso, false para falha
	 */
	private function loadClasse()
	{
		if (class_exists($this->classe,false)){

			$this->controller = new $this->classe;
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * chama o metodo adequado
	 * @return true para sucesso, false para falha
	 */
	private function loadMetodo()
	{
		if (method_exists($this->controller,$this->metodo)){
			
			call_user_func(array($this->controller,$this->metodo),$this->parametros);
			return true;
		} else {
			return false;
		}
	}
	/**
	 * inclui o arquivo, carrega a classe, e chama o metodo adequado
	 */
	public function load()
	{
		if ($this->loadArquivo() == false){
			
			die("arquivo inexistente: $this->arquivo");
			
		} else if ($this->loadClasse() == false){

			die("classe inexistente: $this->classe");
			
		} else 	if ($this->loadMetodo() == false){
			
			die("metodo inexistente: $this->metodo");		
		}
		
		/*
		echo $this->arquivo;
		echo $this->classe;
		echo $this->metodo;
		*/
	}
}
uhetdump($_GET);

$Aplicacao = new Aplicacao();

$Aplicacao->parser();
$Aplicacao->load();


?>